import PropTypes from "prop-types";
import {withStyles} from "@material-ui/core";

const styles = {
    "@global": {
        ".pace": {
            pointerEvents: "none",
            userSelect: "none"
        },
        ".pace-inactive": {
            display: "none"
        },
        ".pace .pace-progress": {
            background: props => props.color || null,
            position: "fixed",
            zIndex: 2000,
            top: 0,
            right: "100%",
            width: "100%",
            height: 3
        }
    }
};

function Pace() {
    activatePace.call(this);
    return null;
}

Pace.propTypes = {
    color: PropTypes.string.isRequired
};

export default withStyles(styles)(Pace);

/* eslint-disable */

/**
 * Pace has defaultly only GET requests enabled. Enable for Post requets too.
 */
window.paceOptions = {
    ajax: {
        trackMethods: ["GET", "POST"]
    }
};

/*!
 * pace.js v1.2.4
 * https://github.com/CodeByZach/pace/
 * Licensed MIT © HubSpot, Inc.
 */
function activatePace() {
    function o(t, e) {
        return function () {
            return t.apply(e, arguments)
        }
    }

    var u, c, i, s, n, y, t, l, v, r, a, p, e, h, w, b, f, g, d, m, k, S, q, L, x, P, T, R, j, O, E, M, A, C, N, _, F,
        U, W, X, D, H, I, z, G, B, J = [].slice, K = {}.hasOwnProperty, Q = function (t, e) {
            for (var n in e) K.call(e, n) && (t[n] = e[n]);

            function r() {
                this.constructor = t
            }

            return r.prototype = e.prototype, t.prototype = new r, t.__super__ = e.prototype, t
        }, V = [].indexOf || function (t) {
            for (var e = 0, n = this.length; e < n; e++) if (e in this && this[e] === t) return e;
            return -1
        };

    function Y() {
    }

    for (g = {
        className: "",
        catchupTime: 100,
        initialRate: .03,
        minTime: 250,
        ghostTime: 100,
        maxProgressPerFrame: 20,
        easeFactor: 1.25,
        startOnPageLoad: !0,
        restartOnPushState: !0,
        restartOnRequestAfter: 500,
        target: "body",
        elements: {checkInterval: 100, selectors: ["body"]},
        eventLag: {minSamples: 10, sampleCount: 3, lagThreshold: 3},
        ajax: {trackMethods: ["GET"], trackWebSockets: !0, ignoreURLs: []}
    }, P = function () {
        var t;
        return null != (t = "undefined" != typeof performance && null !== performance && "function" == typeof performance.now ? performance.now() : void 0) ? t : +new Date
    }, R = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame, f = window.cancelAnimationFrame || window.mozCancelAnimationFrame, p = function (t, e, n) {
        if ("function" == typeof t.addEventListener) return t.addEventListener(e, n, !1);
        var r;
        "function" != typeof t["on" + e] || "object" != typeof t["on" + e].eventListeners ? (r = new s, "function" == typeof t["on" + e] && r.on(e, t["on" + e]), t["on" + e] = function (t) {
            return r.trigger(e, t)
        }, t["on" + e].eventListeners = r) : r = t["on" + e].eventListeners, r.on(e, n)
    }, null == R && (R = function (t) {
        return setTimeout(t, 50)
    }, f = function (t) {
        return clearTimeout(t)
    }), O = function (e) {
        var n = P(), r = function () {
            var t = P() - n;
            return 33 <= t ? (n = P(), e(t, function () {
                return R(r)
            })) : setTimeout(r, 33 - t)
        };
        return r()
    }, j = function () {
        var t = arguments[0], e = arguments[1], n = 3 <= arguments.length ? J.call(arguments, 2) : [];
        return "function" == typeof t[e] ? t[e].apply(t, n) : t[e]
    }, d = function () {
        for (var t, e, n, r = arguments[0], s = 2 <= arguments.length ? J.call(arguments, 1) : [], o = 0, i = s.length; o < i; o++) if (e = s[o]) for (t in e) K.call(e, t) && (n = e[t], null != r[t] && "object" == typeof r[t] && null != n && "object" == typeof n ? d(r[t], n) : r[t] = n);
        return r
    }, h = function (t) {
        for (var e, n, r = e = 0, s = 0, o = t.length; s < o; s++) n = t[s], r += Math.abs(n), e++;
        return r / e
    }, k = function (t, e) {
        var n, r;
        if (null == t && (t = "options"), null == e && (e = !0), r = document.querySelector("[data-pace-" + t + "]")) {
            if (n = r.getAttribute("data-pace-" + t), !e) return n;
            try {
                return JSON.parse(n)
            } catch (t) {
                return "undefined" != typeof console && null !== console ? console.error("Error parsing inline pace options", t) : void 0
            }
        }
    }, Y.prototype.on = function (t, e, n, r) {
        var s;
        return null == r && (r = !1), null == this.bindings && (this.bindings = {}), null == (s = this.bindings)[t] && (s[t] = []), this.bindings[t].push({
            handler: e,
            ctx: n,
            once: r
        })
    }, Y.prototype.once = function (t, e, n) {
        return this.on(t, e, n, !0)
    }, Y.prototype.off = function (t, e) {
        var n, r, s;
        if (null != (null != (r = this.bindings) ? r[t] : void 0)) {
            if (null == e) return delete this.bindings[t];
            for (n = 0, s = []; n < this.bindings[t].length;) this.bindings[t][n].handler === e ? s.push(this.bindings[t].splice(n, 1)) : s.push(n++);
            return s
        }
    }, Y.prototype.trigger = function () {
        var t, e, n, r, s, o, i = arguments[0], a = 2 <= arguments.length ? J.call(arguments, 1) : [];
        if (null != (r = this.bindings) && r[i]) {
            for (n = 0, o = []; n < this.bindings[i].length;) e = (s = this.bindings[i][n]).handler, t = s.ctx, s = s.once, e.apply(null != t ? t : this, a), s ? o.push(this.bindings[i].splice(n, 1)) : o.push(n++);
            return o
        }
    }, B = Y, y = window.Pace || {}, window.Pace = y, d(y, B.prototype), T = y.options = d({}, g, window.paceOptions, k()), X = 0, H = (z = ["ajax", "document", "eventLag", "elements"]).length; X < H; X++) !0 === T[C = z[X]] && (T[C] = g[C]);

    function Z() {
        return Z.__super__.constructor.apply(this, arguments)
    }

    function $() {
        this.progress = 0
    }

    function tt() {
        this.bindings = {}
    }

    function et() {
        var e, o = this;
        et.__super__.constructor.apply(this, arguments), e = function (r) {
            var s = r.open;
            return r.open = function (t, e, n) {
                return A(t) && o.trigger("request", {type: t, url: e, request: r}), s.apply(r, arguments)
            }
        }, window.XMLHttpRequest = function (t) {
            t = new W(t);
            return e(t), t
        };
        try {
            m(window.XMLHttpRequest, W)
        } catch (t) {
        }
        if (null != U) {
            window.XDomainRequest = function () {
                var t = new U;
                return e(t), t
            };
            try {
                m(window.XDomainRequest, U)
            } catch (t) {
            }
        }
        if (null != F && T.ajax.trackWebSockets) {
            window.WebSocket = function (t, e) {
                var n = null != e ? new F(t, e) : new F(t);
                return A("socket") && o.trigger("request", {type: "socket", url: t, protocols: e, request: n}), n
            };
            try {
                m(window.WebSocket, F)
            } catch (t) {
            }
        }
    }

    function nt() {
        this.complete = o(this.complete, this);
        var t = this;
        this.elements = [], S().on("request", function () {
            return t.watch.apply(t, arguments)
        })
    }

    function rt(t) {
        var e, n, r, s;
        for (null == t && (t = {}), this.complete = o(this.complete, this), this.elements = [], null == t.selectors && (t.selectors = []), n = 0, r = (s = t.selectors).length; n < r; n++) e = s[n], this.elements.push(new i(e, this.complete))
    }

    function st(t, e) {
        this.selector = t, this.completeCallback = e, this.progress = 0, this.check()
    }

    function ot() {
        var t, e, n = this;
        this.progress = null != (e = this.states[document.readyState]) ? e : 100, t = document.onreadystatechange, document.onreadystatechange = function () {
            return null != n.states[document.readyState] && (n.progress = n.states[document.readyState]), "function" == typeof t ? t.apply(null, arguments) : void 0
        }
    }

    function it(t) {
        this.source = t, this.last = this.sinceLastUpdate = 0, this.rate = T.initialRate, this.catchup = 0, this.progress = this.lastProgress = 0, null != this.source && (this.progress = j(this.source, "progress"))
    }

    B = Error, Q(Z, B), n = Z, $.prototype.getElement = function () {
        var t;
        if (null == this.el) {
            if (!(t = document.querySelector(T.target))) throw new n;
            this.el = document.createElement("div"), this.el.className = "pace pace-active", document.body.className = document.body.className.replace(/(pace-done )|/, "pace-running ");
            var e = "" !== T.className ? " " + T.className : "";
            this.el.innerHTML = '<div class="pace-progress' + e + '">\n  <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>', null != t.firstChild ? t.insertBefore(this.el, t.firstChild) : t.appendChild(this.el)
        }
        return this.el
    }, $.prototype.finish = function () {
        var t = this.getElement();
        return t.className = t.className.replace("pace-active", "pace-inactive"), document.body.className = document.body.className.replace("pace-running ", "pace-done ")
    }, $.prototype.update = function (t) {
        return this.progress = t, y.trigger("progress", t), this.render()
    }, $.prototype.destroy = function () {
        try {
            this.getElement().parentNode.removeChild(this.getElement())
        } catch (t) {
            n = t
        }
        return this.el = void 0
    }, $.prototype.render = function () {
        var t, e, n, r, s, o, i;
        if (null == document.querySelector(T.target)) return !1;
        for (t = this.getElement(), r = "translate3d(" + this.progress + "%, 0, 0)", s = 0, o = (i = ["webkitTransform", "msTransform", "transform"]).length; s < o; s++) e = i[s], t.children[0].style[e] = r;
        return (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) && (t.children[0].setAttribute("data-progress-text", (0 | this.progress) + "%"), 100 <= this.progress ? n = "99" : (n = this.progress < 10 ? "0" : "", n += 0 | this.progress), t.children[0].setAttribute("data-progress", "" + n)), y.trigger("change", this.progress), this.lastRenderedProgress = this.progress
    }, $.prototype.done = function () {
        return 100 <= this.progress
    }, c = $, tt.prototype.trigger = function (t, e) {
        var n, r, s, o, i;
        if (null != this.bindings[t]) {
            for (i = [], r = 0, s = (o = this.bindings[t]).length; r < s; r++) n = o[r], i.push(n.call(this, e));
            return i
        }
    }, tt.prototype.on = function (t, e) {
        var n;
        return null == (n = this.bindings)[t] && (n[t] = []), this.bindings[t].push(e)
    }, s = tt, W = window.XMLHttpRequest, U = window.XDomainRequest, F = window.WebSocket, m = function (t, e) {
        var n, r = [];
        for (n in e.prototype) try {
            null == t[n] && "function" != typeof e[n] ? "function" == typeof Object.defineProperty ? r.push(Object.defineProperty(t, n, {
                get: function (t) {
                    return function () {
                        return e.prototype[t]
                    }
                }(n), configurable: !0, enumerable: !0
            })) : r.push(t[n] = e.prototype[n]) : r.push(void 0)
        } catch (t) {
            0
        }
        return r
    }, L = [], y.ignore = function () {
        var t = arguments[0], e = 2 <= arguments.length ? J.call(arguments, 1) : [];
        return L.unshift("ignore"), e = t.apply(null, e), L.shift(), e
    }, y.track = function () {
        var t = arguments[0], e = 2 <= arguments.length ? J.call(arguments, 1) : [];
        return L.unshift("track"), e = t.apply(null, e), L.shift(), e
    }, A = function (t) {
        if (null == t && (t = "GET"), "track" === L[0]) return "force";
        if (!L.length && T.ajax) {
            if ("socket" === t && T.ajax.trackWebSockets) return !0;
            if (t = t.toUpperCase(), 0 <= V.call(T.ajax.trackMethods, t)) return !0
        }
        return !1
    }, Q(et, s), t = et, D = null, M = function (t) {
        for (var e, n = T.ajax.ignoreURLs, r = 0, s = n.length; r < s; r++) if ("string" == typeof (e = n[r])) {
            if (-1 !== t.indexOf(e)) return !0
        } else if (e.test(t)) return !0;
        return !1
    }, (S = function () {
        return D = null == D ? new t : D
    })().on("request", function (t) {
        var o, i = t.type, a = t.request, e = t.url;
        if (!M(e)) return y.running || !1 === T.restartOnRequestAfter && "force" !== A(i) ? void 0 : (o = arguments, "boolean" == typeof (e = T.restartOnRequestAfter || 0) && (e = 0), setTimeout(function () {
            var t, e, n, r, s = "socket" === i ? a.readyState < 1 : 0 < (s = a.readyState) && s < 4;
            if (s) {
                for (y.restart(), r = [], t = 0, e = (n = y.sources).length; t < e; t++) {
                    if ((C = n[t]) instanceof u) {
                        C.watch.apply(C, o);
                        break
                    }
                    r.push(void 0)
                }
                return r
            }
        }, e))
    }), nt.prototype.watch = function (t) {
        var e = t.type, n = t.request, t = t.url;
        if (!M(t)) return n = new ("socket" === e ? r : a)(n, this.complete), this.elements.push(n)
    }, nt.prototype.complete = function (e) {
        return this.elements = this.elements.filter(function (t) {
            return t !== e
        })
    }, u = nt, a = function (e, n) {
        var t, r, s, o, i = this;
        if (this.progress = 0, null != window.ProgressEvent) for (p(e, "progress", function (t) {
            return t.lengthComputable ? i.progress = 100 * t.loaded / t.total : i.progress = i.progress + (100 - i.progress) / 2
        }), t = 0, r = (o = ["load", "abort", "timeout", "error"]).length; t < r; t++) p(e, o[t], function () {
            return n(i), i.progress = 100
        }); else s = e.onreadystatechange, e.onreadystatechange = function () {
            var t;
            return 0 === (t = e.readyState) || 4 === t ? (n(i), i.progress = 100) : 3 === e.readyState && (i.progress = 50), "function" == typeof s ? s.apply(null, arguments) : void 0
        }
    }, r = function (t, e) {
        for (var n, r = this, s = this.progress = 0, o = (n = ["error", "open"]).length; s < o; s++) p(t, n[s], function () {
            return e(r), r.progress = 100
        })
    }, rt.prototype.complete = function (e) {
        return this.elements = this.elements.filter(function (t) {
            return t !== e
        })
    }, k = rt, st.prototype.check = function () {
        var t = this;
        return document.querySelector(this.selector) ? this.done() : setTimeout(function () {
            return t.check()
        }, T.elements.checkInterval)
    }, st.prototype.done = function () {
        return this.completeCallback(this), this.completeCallback = null, this.progress = 100
    }, i = st, ot.prototype.states = {loading: 0, interactive: 50, complete: 100}, B = ot, Q = function () {
        var e, n, r, s, o, i = this;
        this.progress = 0, o = [], s = 0, r = P(), n = setInterval(function () {
            var t = P() - r - 50;
            return r = P(), o.push(t), o.length > T.eventLag.sampleCount && o.shift(), e = h(o), ++s >= T.eventLag.minSamples && e < T.eventLag.lagThreshold ? (i.progress = 100, clearInterval(n)) : i.progress = 3 / (e + 3) * 100
        }, 50)
    }, it.prototype.tick = function (t, e) {
        return 100 <= (e = null == e ? j(this.source, "progress") : e) && (this.done = !0), e === this.last ? this.sinceLastUpdate += t : (this.sinceLastUpdate && (this.rate = (e - this.last) / this.sinceLastUpdate), this.catchup = (e - this.progress) / T.catchupTime, this.sinceLastUpdate = 0, this.last = e), e > this.progress && (this.progress += this.catchup * t), e = 1 - Math.pow(this.progress / 100, T.easeFactor), this.progress += e * this.rate * t, this.progress = Math.min(this.lastProgress + T.maxProgressPerFrame, this.progress), this.progress = Math.max(0, this.progress), this.progress = Math.min(100, this.progress), this.lastProgress = this.progress, this.progress
    }, v = it, b = e = _ = w = E = N = null, y.running = !1, q = function () {
        if (T.restartOnPushState) return y.restart()
    }, null != window.history.pushState && (I = window.history.pushState, window.history.pushState = function () {
        return q(), I.apply(window.history, arguments)
    }), null != window.history.replaceState && (G = window.history.replaceState, window.history.replaceState = function () {
        return q(), G.apply(window.history, arguments)
    }), l = {ajax: u, elements: k, document: B, eventLag: Q}, (x = function () {
        var t, e, n, r, s, o, i, a;
        for (y.sources = N = [], e = 0, r = (o = ["ajax", "elements", "document", "eventLag"]).length; e < r; e++) !1 !== T[t = o[e]] && N.push(new l[t](T[t]));
        for (n = 0, s = (a = null != (i = T.extraSources) ? i : []).length; n < s; n++) C = a[n], N.push(new C(T));
        return y.bar = w = new c, E = [], _ = new v
    })(), y.stop = function () {
        return y.trigger("stop"), y.running = !1, w.destroy(), b = !0, null != e && ("function" == typeof f && f(e), e = null), x()
    }, y.restart = function () {
        return y.trigger("restart"), y.stop(), y.start()
    }, y.go = function () {
        var m;
        return y.running = !0, w.render(), m = P(), b = !1, e = O(function (t, e) {
            w.progress;
            for (var n, r, s, o, i, a, u, c, l, p, h = a = 0, f = !0, g = u = 0, d = N.length; u < d; g = ++u) for (C = N[g], i = null != E[g] ? E[g] : E[g] = [], s = c = 0, l = (r = null != (p = C.elements) ? p : [C]).length; c < l; s = ++c) o = r[s], f &= (o = null != i[s] ? i[s] : i[s] = new v(o)).done, o.done || (h++, a += o.tick(t));
            return n = a / h, w.update(_.tick(t, n)), w.done() || f || b ? (w.update(100), y.trigger("done"), setTimeout(function () {
                return w.finish(), y.running = !1, y.trigger("hide")
            }, Math.max(T.ghostTime, Math.max(T.minTime - (P() - m), 0)))) : e()
        })
    }, y.start = function (t) {
        d(T, t), y.running = !0;
        try {
            w.render()
        } catch (t) {
            n = t
        }
        return document.querySelector(".pace") ? (y.trigger("start"), y.go()) : setTimeout(y.start, 50)
    }, "function" == typeof define && define.amd ? define(function () {
        return y
    }) : "object" == typeof exports ? module.exports = y : T.startOnPageLoad && y.start()
};
